home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
etc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-19
|
50KB
|
2,977 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
#include "doslib.h"
#include "prnt0.c"
void
etc_rot_font(UINT c,FNTDATA *BUF)
{
register STR dp;
register int x,y,x8,mask;
UBYTE w0[24*3];
if ((BUF->xl == 24) && (BUF->yl == 24)) {
dp = BUF->buffer;
if (c <= L'ヶ') {
x = 0;
while(c >= (y = tate_org_font_list[x])) {
if (y == c) {
register STR p;
p = &tate_org_font_data[x*24*3];
for(x=0;x<24*3;x++) {
*dp++ = *p++;
}
return;
}
x++;
}
}
if (c <= L'╂') {
x = 0;
while(c >= (y = tate_not_list[x++])) {
if (y == c) {
return;
}
}
}
for(x=0;x<24*3;x++) {
w0[x] = dp[x]; /* コピー */
dp[x] = 0; /* ERASE */
}
for(x=0;x<24;x++) {
x8 = x/8;
mask = (128 >> (x % 8));
for(y=0;y<24;y++) {
if (w0[y*3+x8] & mask) {
dp[(23-x)*3+(y/8)] |= (128 >> (y % 8));
}
}
}
}
}
UBYTE
etc_last(UBYTE *p)
{
if (*p) {
return(p[strlen(p)-1]);
} else {
return(EOS);
}
}
/* 文字列の最後の文字を返す */
/* 全角文字にも対応 */
UWORD
etc_jlast_p(STR s,STR *p)
{
register UWORD c,c0,lc;
register STR p0;
lc = 0;
p0 = s;
while(c = *s++) {
p0 = s-1;
if (string_1or2_byte_code(c)-1) { /* 2バイトコードの1バイト目なら */
if (c0 = *s++) {
lc = (c << 8) | c0;
} else {
error("奇妙な文字列を処理しようとしました");
}
} else { /* 1バイトコードなら */
lc = c;
}
}
*p = p0;
return(lc);
}
/* 文字列の最後の文字を返す */
/* 全角文字にも対応 */
UWORD
etc_jlast(STR s)
{
register UWORD c,c0,lc;
lc = 0;
while(c = *s++) {
if (string_1or2_byte_code(c)-1) { /* 2バイトコードの1バイト目なら */
if (c0 = *s++) {
lc = (c << 8) | c0;
} else {
error("奇妙な文字列を処理しようとしました");
}
} else { /* 1バイトコードなら */
lc = c;
}
}
return(lc);
}
/* 最初の1文字を返す */
/* 全角対応 */
UINT
etc_jfirst(STR s)
{
register UINT c;
if (iskanji(c = *s)) {
c = (c << 8) | s[1];
} else {
if ((c == 0x80) || (c == 0xf0) || (c == 0xf1) || (c == 0xf2) || (c == 0xf3)) {
c = (c << 8) | s[1];
}
}
return(c);
}
/* 2文字目へのポインタを返す */
/* 最初の文字を返す */
/* 全角文字にも対応 */
/* EOS なら NULL を返す */
STR
etc_jfirst_x(STR s,UINT *cret)
{
register UWORD c,c0;
if ((!s) || !*s) {
*cret = EOS;
return((STR) NULL);
}
if (c = *s++) {
if (string_1or2_byte_code(c)-1) { /* 2バイトコードの1バイト目なら */
if (c0 = *s++) {
*cret = (c << 8) | c0;
return(s);
} else {
*cret = c;
return(s-1);
}
} else { /* 1バイトコードなら */
*cret = c;
return(s);
}
} else {
return((STR) NULL);
}
}
/* i バイト目を越えない最後の文字を返す */
/* 全角文字にも対応 */
UWORD
etc_j_n_char(STR s,int i)
{
register UWORD c,c0,lc;
lc = 0;
while((c = *s++) && (i--)) {
if (string_1or2_byte_code(c)-1) { /* 2バイトコードの1バイト目なら */
if (c0 = *s++) {
i--;
lc = (c << 8) | c0;
} else {
error("奇妙な文字列を処理しようとしました");
}
} else { /* 1バイトコードなら */
lc = c;
}
}
return(lc);
}
int
etc_iocs(int d0,int d1, int d2)
{
#asm
move.l 4(sp),d0
move.l 8(sp),d1
move.l 12(sp),d2
trap #15
rts
#endasm
}
void
etc_dump_screen()
{
int i;
UNIT *p;
for(i=0;i<YWIDTH-1;i++) {
window_abs_loc(32,i);
if ((p = SCREEN[i]) == TAIL) {
B_PRINT(" TAIL ");
} else if (p == NIL) {
B_PRINT(" NIL ");
} else if (p == NOT) {
B_PRINT(" NOT ");
} else {
UBYTE db[VERY_LONG_LINE];
cut_disp_convert(p->BODY,db,CURRENT_JIZUME);
B_PRINT(db);
}
}
work_cursor_cpx();
}
void
etc_dump_cut_buff()
{
UBYTE db[VERY_LONG_LINE];
UNIT *p;
int y;
init_clear_screen();
p = CUT_BUFF_HEAD;
for(y = 0;y < YWIDTH0;y++) {
if (!p) break;
disp_1line(y,p);
p = p->ATO;
}
getchar();
}
int
etc_sign(int i)
{
if (i) {
return((i<0) ? -1:1);
} else {
return(0);
}
}
/*
TPLANE equ $944 *L テキストプレーン ($E00000:TXT0)
TOFS equ $948 *L テキストプレーン表示位置オフセット (0)
CRT_DOUJI equ $E8_002A ; CRT 同時アクセス
*/
/* ボックス消去 */
/* x0, x1 = キャラ座標 */
/* y0, yw = ドット座標 */
void
etc_era_box(int x0,int y0,int x1,int yw)
{
#asm
TPLANE equ $944
TOFS equ $948
CRT_DOUJI equ $E8_002A
movem.l d0-d4/a1,era_save
moveq.l #$81,d0 * to super
clr.l a1
trap #15
move.l d0,era_save_ssp
move.l 4(sp),d0 * x0
move.l 12(sp),d2 * x1
* <- 128 ->
* <- d2 ->
* <- d0 ->
* AAAAAAAAAAAAAAAAXXXXXXXX
* AAAAAAAAAAAAAAAA
* 128 - d2 + d0 -1
move.l #128-1,d4
add.w d0,d4
sub.w d2,d4 * d4 = スキップバイトカウンタ
sub.l d0,d2
ble era_exit * 始まりと終わりが同じ位置
move.l 16(sp),d3 * yw
beq era_exit * 縦幅0
move.l 8(sp),d1 * y0
* d2.w:消去桁数
* d0.l:消去開始位置
asl.l #7,d1 * ×(1024/8):行方向オフセット計算
add.l d0,d1 * 桁方向オフセット加算
* add.l TOFS,d1 * 表示開始位置オフセット加算
add.l TPLANE,d1 * 対象テキストプレーン
movea.l d1,a1
* a1.l:TVRAM アドレス
subq.l #1,d3
* d3.w:消去する縦幅
* d4.w:スキップバイトカウンタ
bset.b #0,CRT_DOUJI * 同時アクセス on
clr.w d0 * 通常用消去データプリセット
era1_y_loop:
move.w d2,d1 * ループカウンタ初期化
era1_x_loop:
move.b d0,(a1)+ * 消去データ書き込み
dbf d1,era1_x_loop * 内ループ
adda.l d4,a1 * 次ライン
dbf d3,era1_y_loop
bclr.b #0,CRT_DOUJI * 同時アクセス off
era_exit
moveq.l #$81,d0
movea.l era_save_ssp,a1
trap #15
movem.l era_save,d0-d4/a1
rts
.data
.even
era_save
ds.l 6
era_save_ssp
ds.l 1
#endasm
}
int
etc_get_arg()
{
int a;
a = ARG;
ARG = 0;
/* under_blanc();*/
return(a);
}
void
etc_set_arg(int a)
{
UBYTE w[MAXLINE];
ARG = a;
sprintf((char *) w,"Arg: %u",a);
under_print0(w);
}
void
etc_set_ed_arg(int a)
{
UBYTE w[MAXLINE];
ARG = a;
sprintf((char *) w,"*%u",a);
under_print0(w);
}
void
etc_push_arg(int a)
{
ARG = a;
}
/* コードから、文字の種類を判別する */
UWORD
etc_check_char_kind(UINT c)
{
if (c >= 0x100) {
c >>= 8;
}
return(etc_check_char_kind_1byte(c));
}
#define BYTE1_MASK 0b000010011
#define BYTE2_MASK 0b011101100 /* ただし XCODE の一部は2バイト */
#define HABA0_MASK 0b100000000
#define HABA1_MASK 0b001010110
#define HABA2_MASK 0b010101001
/* 1バイトから、文字の種類を判別する */
/* XCODE | 謎のコード | 2byte半角の上 | 2水 | カタカナ | 1水 | 2byte半角の下 | ANK | CTRL */
/* (1/4角) 半角ひらがな */
/* EX: 1byte 000010011 */
/* haba0 100000000 */
/* haba1 001010110 */
/* haba2 010101001 */
UWORD
etc_check_char_kind_1byte(register UBYTE c)
{
if (c < 0x20) {
return(0b1);
} else if (c < 0x80) {
return(0b10);
} else if (c == 0x80) {
return(0b100);
} else if (c < 0xa0) {
return(0b1000);
} else if (c < 0xe0) {
return(0b10000);
} else if (c < 0xf0) {
return(0b100000);
} else if (c < 0xf4) {
return(0b1000000);
} else if (c < XCODE_UP) {
return(0b10000000);
} else {
return(0b100000000);
}
}
/* ポインタの指しているところの文字のバイト幅を返す */
/* 1,2 */
UINT
etc_char_byte_haba(STR p)
{
if (BYTE1_MASK & etc_check_char_kind_1byte(*p)) {
return(1);
} else {
return(2);
}
}
/* ポインタの指しているところの文字の表示幅を返す */
/* 0,1,2 */
UINT
etc_char_disp_haba(STR p)
{
register UBYTE c;
if (c == *p) {
if (HABA1_MASK & etc_check_char_kind_1byte(c)) {
return(1);
} else {
return(2);
}
} else {
return(0);
}
}
/* 文字のバイト幅を返す */
/* 1,2 */
UINT
etc_char_byte_len(UINT c)
{
return((c >= 0x100) ? 2:1);
}
/* 文字の表示幅を返す */
/* 0,1,2 */
UINT
etc_char_disp_len(UINT c)
{
if (c) {
if (c >= 0x100) {
c >>= 8;
}
if (HABA1_MASK & etc_check_char_kind_1byte(c)) {
return(1);
} else {
return(2);
}
} else {
return(0);
}
}
UINT
inkey()
{
disp_cursor_on();
disp_show_cursor();
return(fep_inkey());
}
#if 0
void
dinkey()
{
UINT c;
etc_beep();
while(1) {
if ((c = fep_inkey_raw()) == (UINT) ('C'-'@')) {
ctrl_x_ctrl_c();
}
if (c == '.') {
break;
} else {
putchar(c);
}
}
}
void
wbinkey()
{
etc_while_fep_qxf();
binkey();
}
UINT
inkey0()
{
return(fep_inkey());
}
void
binkey0()
{
etc_beep();
if (inkey0() == (UINT) ('C'-'@')) {
etc_exit(0);
}
}
#endif
#if 0
void
upr(STR s)
{
under_print(s);
}
void
upr0(STR s)
{
under_blanc();
}
void
uprb(STR s)
{
under_print(s);
binkey();
}
void
upr0b(STR s)
{
under_blanc();
binkey();
}
#endif
/* 2点の順序を整える */
/* エラーなら0を返す */
int
etc_line_order(UNIT **p1,int *bp1,UNIT **p2,int *bp2)
{
register UNIT *wp1,*wp2;
if ((wp1 = *p1) == (wp2 = *p2)) { /* 同じ行である */
if (*bp1 > *bp2) {
/* 交換 */
register int w;
w = *bp1;
*bp1 = *bp2;
*bp2 = w;
}
return(1);
}
do { /* まずは p1 から */
if (wp1 == wp2) {
return(1);
}
} while(wp1 = wp1->ATO);
wp1 = *p1;
do { /* 次に p2 から */
if (wp2 == wp1) {
register int w;
/* 交換 */
*p1 = *p2;
*p2 = wp1;
w = *bp1;
*bp1 = *bp2;
*bp2 = w;
return(1);
}
} while(wp2 = wp2->ATO);
return(0);
}
int
etc_set_tab(int n)
{
if (TAB_LENGTH != n) {
TAB_LENGTH = n;
TAB_LENGTH_1 = TAB_LENGTH - 1;
return(1);
} else {
return(0);
}
}
void
lddr(STR d,STR s,int i)
{
register int c = i;
register STR dest = d+i;
register STR sour = s+i;
for(;c>0;c--) {
*--dest = *--sour;
}
}
/*
void
dumper(STR s)
{
int i;
window0();
i = min(40,strlen(s));
printf("dumper:");
for(;i>0;i--) {
printf("%x:",*s++);
}
binkey();
}
*/
#define click_size 32
#define click_cl 4
#define click_mode 3
#define click_length 32
UBYTE click_buf[click_size] = {
0x1f,0x1f,0x3f,0x3f,0x1f,0x1f,0x3f,0x3f,
0x1f,0x1f,0x3f,0x3f,0x1f,0x1f,0x3f,0x3f,
0x1f,0x1f,0x3f,0x3f,0x1f,0x1f,0x3f,0x3f};
void
etc_click()
{
if (CLICK_MODE) {
a_play(click_buf,click_size,click_cl,click_mode,click_length);
}
}
struct NAMECKBUF INF;
UBYTE INF_drive[3];
/* 名前情報を分解する */
int
etc_set_INF(STR file)
{
int r;
r = NAMECK(file,&INF);
strncpy(INF_drive,INF.drive,2);
INF_drive[2] = EOS;
return(r);
}
void
etc_get_pathname(STR pathname,STR file)
{
if (etc_set_INF(file) < 0) {
*pathname = EOS;
return;
}
strcpy(pathname,INF_drive);
strcat(pathname,INF.path);
strcat(pathname,INF.name);
strcat(pathname,INF.ext);
}
void
etc_get_pathname_bak(STR pathname,STR file)
{
etc_set_INF(file);
strcpy(pathname,INF_drive);
strcat(pathname,INF.path);
strcat(pathname,INF.name);
strcat(pathname,".BAK");
}
/* name から、フルパスの暫定ファイル名を得る */
void
etc_get_tname(STR tname,STR file)
{
UBYTE pri[MAXLINE];
STR tn;
etc_set_INF(file); /* パーツ分解 */
strcpy((char *)tname,(char *)INF_drive); /* ドライブ名を得る */
strcat((char *)tname,(char *)INF.path); /* パスを得る */
if (tn = (STR) tempnam((char *)tname,"tw")) {
strcpy((char *)tname,(char *)tn);
} else {
under_print0((STR)"暫定ファイル名を作れないのでセーブ出来ません[Y]?");
etc_beep();
etc_wait_y();
*tname = EOS;
}
}
UBYTE etc_path[MAXLINE];
STR
etc_ret_current_path()
{
etc_set_INF("");
strncpy(etc_path,INF.drive,2);
etc_path[2] = EOS;
strcat(etc_path,INF.path);
}
/*
void
etc_get_pathpri(STR pathpri,STR file)
{
struct NAMECKBUF INF;
NAMECK(file,&INF);
strncpy(pathpri,INF.drive,2);
pathpri[2] = EOS;
strcat(pathpri,INF.path);
strcat(pathpri,INF.name);
}
void
etc_get_pri(STR pri,STR file)
{
struct NAMECKBUF INF;
NAMECK(file,&INF);
strcpy(pri,INF.name);
}
*/
UWORD FUNC_FLAG = 1; /* 初期値では、表示されている */
void
etc_func_on()
{
if (!FUNC_FLAG) { /* 表示されてないなら */
etc_func_on0(); /* 表示する */
}
}
void
etc_func_off()
{
if (FUNC_FLAG) { /* 表示されているなら */
etc_func_off0(); /* を消す */
}
}
/* ファンクションキー表示をする */
void
etc_func_on0()
{
FUNC_FLAG = 1;
#asm
CONCTRL equ $ff23
move.w #0,-(sp)
move.w #14,-(sp)
DC.W CONCTRL
addq.l #4,sp
#endasm
}
/* ファンクションキー表示を消す */
void
etc_func_off0()
{
FUNC_FLAG = 0;
#asm
move.w #2,-(sp)
move.w #14,-(sp)
DC.W CONCTRL
addq.l #4,sp
#endasm
}
/* 与えられたコードを積極的にスペースに修正する */
UINT
etc_normal_jis(UINT a)
{
unsigned int b,c;
if (a < 0x100) {
return(a);
} else if (buff_ishan2byte(a >> 8)) {
return(a);
}
b = JISSFT(SFTJIS(a));
if (a == b) { /* 2度変換して元に戻った */
return(a);
} else {
return(L' '); /* 空白を返す */
}
}
/* 与えられたファイル番号を持つテキスト番号を捜す */
/* 無ければ-1を返す */
int
etc_text_search(int f)
{
register int tn;
for(tn=0;tn<MAX_TEXT;tn++) {
if (TDATA[tn].TEXT_FILE == f) {
return(tn);
}
}
return(-1);
}
int
etc_group(UINT c)
{
if (c < 0x100) { /* 半角 */
if (!isalnmkana(c)) { /* 英数字でもカナでもない */
return(0); /* コントロールと記号 */
} else if (isalnum(c)) {/* 英数字だ */
return(1);
} else { /* それ以外だ(多分カナ) */
return(2);
}
} else if (c < 0x8140) { /* 半角2バイト文字だ */
return(3);
} else if (c < 0x824f) { /* 全角の記号だ */
if ((L'ー' <= c) && (c <= L'‐')) {
return(5); /* !!! */
} else {
return(0);
}
}
return(5);
}
/*
))))))))aaaAAAaaa¥¥¥¥¥:::::
*/
UINT
etc_tolower(UINT c)
{
if (c < 0x100) {
return(tolower(c));
} else if (jisupper(c)) {
return(c - ((UINT)L'A' - (UINT)L'a'));
}
return(c);
}
UINT
etc_toupper(UINT c)
{
if (c < 0x100) {
return(toupper(c));
} else if (jislower(c)) {
return(c + ((UINT)L'A' - (UINT)L'a'));
}
return(c);
}
UBYTE handakuten_list[] = "はひふへほハヒフヘホ";
UBYTE dakuten_list[] = "かきくけこさしすせそたちつてとはひふへほ\\
カキクケコサシスセソタチツテトハヒフヘホ";
UINT
etc_handakuten_able()
{
UINT c;
ctrl_b();
c = line_cpx_code();
if (jstrchr(handakuten_list,c)) {
return(c+2);
} else {
ctrl_f(); /* 戻して */
return(0);
}
}
UINT
etc_dakuten_able_under(UWORD c)
{
return(jstrchr(dakuten_list,c));
}
UINT
etc_handakuten_able_under(UWORD c)
{
return(jstrchr(handakuten_list,c));
}
UINT
etc_dakuten_able()
{
UINT c;
ctrl_b();
c = line_cpx_code();
if (jstrchr(dakuten_list,c)) {
return(c+1);
} else {
ctrl_f(); /* 戻して */
return(0);
}
}
/* CR を <NL> にしたり、コントロールコードを ^? にしたりする */
void
etc_string_esc_cnv(STR s,STR d)
{
register UBYTE c;
while(c = *s++) {
if (c < 0x20) {
if (c == 'J'-'@') {
strncpy(d,"<NL>",4);
d += 4;
} else {
*d++ = '^';
*d++ = c + '@';
}
} else {
*d++ = c;
if (etc_check_char_kind_1byte(c) & BYTE2_MASK) {
*d++ = *s++;
}
}
}
*d = EOS;
}
int
etc_str_han_to_zen(STR d0,STR s,int size)
{
UINT c;
register UINT c0;
register STR d;
UBYTE w[VERY_LONG_LINE];
int flag;
d = w;
while(s = etc_jfirst_x(s,&c)) {
flag = 0;
if (c >= 0x100) {
if ((0x8000 <= c) && (c <= 0x80df)) {
/* 半角2バイト英数字、ひらがな */
c &= 0xff; /* いったんカタカナへ */
flag = 1;
} else {
*d++ = (UBYTE)(c>>8); /* 上位バイト */
*d++ = (UBYTE)c; /* 下位バイト */
continue;
}
}
c0 = hantozen(c);
if (c0 == c) { /* 変換されなかった */
*d++ = (UBYTE)c0; /* 1バイト */
} else { /* 変換された */
if (flag) {
c0 = etc_zen_kata_to_hira1(c0);
}
if (*s == (UBYTE)'゙') {
if (jstrchr(dakuten_list,c0)) { /* 濁点にできる */
c0++;
s += 1;
}
} else if ((s[0] == 0x80) && (s[1] == 0xde)) { /* 次が2バイト濁点だ */
c0++;
s += 2;
} else if (*s == (UBYTE)'゚') { /* 次が半濁点だ */
if (jstrchr(handakuten_list,c0)) { /* 濁点にできる */
c0 += 2;
s += 1;
}
} else if ((s[0] == 0x80) && (s[1] == 0xdf)) { /* 次が2バイト濁点だ */
c0 += 2;
s += 2;
}
*d++ = (UBYTE)(c0 >> 8); /* 上位バイト */
*d++ = (UBYTE)c0; /* 下位バイト */
}
}
*d = EOS;
if (strlen(w) > MAX_TB) {
etc_beep();
under_print("全角へ変換する文字列が長すぎます");
return(1);
} else {
strcpy(d0,w);
return(0);
}
}
int
etc_str_zen_to_han(STR d0,STR s,int size)
{
UINT c;
register UINT c0;
register STR d;
UBYTE w[MAXLINE];
d = w;
while(s = etc_jfirst_x(s,&c)) {
if (c < 0x100) {
*d++ = c;
continue;
}
c0 = zentohan(c);
if (c0 == c) { /* 変換されなかった */
if (c0 & 0xff00) { /* 2バイトだ */
*d++ = (UBYTE)(c0>>8); /* 上位バイト */
}
*d++ = (UBYTE)c0; /* 下位バイト */
} else { /* 変換された */
*d++ = (UBYTE)c0; /* 下位バイト */
if (c0 & 0xff00) { /* 2バイトだ(濁点、半濁点がある) */
*d++ = (UBYTE)(c0 >> 8); /* 上位バイト */
}
}
}
*d = EOS;
strcpy(d0,w);
return(0);
}
int
etc_just_kaigyou(UNIT *wp)
{
UBYTE w[VERY_LONG_LINE];
line_get_body(w,wp);
return(*line_skip_xcode(w) == CR);
}
#if 0
void
etc_om_exit()
{
under_print0((STR)"ファイルの途中までしか読み込めません。中断します [Y]? ");
etc_y_exit();
}
#endif
void
etc_y_exit()
{
UBYTE c;
fep_key_clear();
while(1) {
etc_beep();
c = toupper(fep_inkey_raw());
if (c == 'Y') {
init_exit();
etc_exit(0);
}
}
}
etc_inp_y(STR mess)
{
UBYTE c;
under_print0(mess);
while(1) {
etc_beep();
c = toupper(fep_inkey_raw());
if (c == 'Y') {
return;
}
}
}
STR
etc_jstrup(STR s)
{
register STR p;
register UBYTE c;
p = s;
while(c = *p) {
if (iskanji(c) || (c == XCODE_UP)) {
p += 2;
} else {
*p++ = toupper(c);
}
}
return(s);
}
STR
etc_name_to_full(STR s)
{
UBYTE w[MAXLINE];
etc_get_pathname(w,s);
strcpy(s,w);
return(s);
}
/* 変更を受けている */
int
etc_check_changed()
{
register int t;
for(t=0;t<MAX_TEXT;t++) {
if ((TDATA[t].TEXT_FILE >= 0) && (TDATA[t].CHANGED_FLAG)) {
return(1);
}
}
return(0);
}
#define HumanST 0x6800
UBYTE nname[9] = "NUL ";
UBYTE cname[9] = "CON ";
/* 最後に組み込まれている con を得る */
UINT
etc_get_last_con()
{
register int a0,a1;
register int i;
UINT lcon = 0;
if (DUM_FLAG) {
return(0);
}
a0 = HumanST;
a1 = nname;
while(1) {
while(1) {
while(B_WPEEK(a0) != (('N'<<8) |'U')) {
a0 += 2;
}
if ((B_LPEEK(a0) == B_LPEEK(a1))
&& (B_LPEEK(a0+4) == B_LPEEK(a1+4))) { /* 一致 */
break;
} else {
a0 += 2;
}
} /* デバイス「NULL」をさがす */
if (a0 >= a1) {
error("CONデバイスが異常です");
}
a0 += 2;
if (B_WPEEK(a0-18) != 0x8024) {
break;
}
}
a0 -= 16;
while(1) {
a1 = a0+14; /* name */
for(i=0;i<8;i++) {
if (B_BPEEK(a1+i) != cname[i]) {
break;
}
}
if (i == 8) {
lcon = a0;
}
a0 = B_LPEEK(a0);
if (a0 == -1) {
break;
}
}
return(lcon);
}
/*
_CHAR_DEV equ $8000 *キャラクタデバイス
_RAW equ $0020 *指定バイトずつ処理
_NUL equ $0004 *nulデバイス
*/
void
etc_color(int c)
{
color(c);
CTCOLOR = c;
}
/* x,y = キャラ座標 */
/* 新しい x 座標を返す */
int
etc_bit_convert_and_disp(int x,int y,STR disp_work)
{
UBYTE blue_mask[XWIDTH];
register int xx;
xx = etc_bit_convert(disp_work,PAT,LYW_UPPER,LYW_MAIN,LYW_UNDER,CURRENT_JIZUME,x,blue_mask)
- CUT_GETA;
/* 変換する */
disp_cursor_off();
etc_put_pattern(x,y*LYW_TOTAL,PAT,blue_mask);
return(xx+x);
}
/* CUT_GETA + 表示幅を返す */
int
etc_bit_convert(STR s,UBYTE *pat,int upw,int mw,int dnw,int jj,int x,STR blue_mask)
{
#asm
XCODE_UP equ $0ff * 拡張コードの開始
XCODE_MARK equ $020 * マーク 0x20 - 0x29
XCODE_SYSMARK equ $030 * システムマーク 0x30 - 0x3f
XCODE_MARKLAST equ $03f * マークの最後
XCODE_UL equ $040 * 下線
XCODE_RB10 equ $050 * 予約:1文字真ん中ルビ
XCODE_RB1 equ $051 * 1文字ルビ(半角用)
XCODE_RB1L equ $052 * 1文字ルビ左(全角用)
XCODE_RB1R equ $053 * 1文字ルビ右(全角用)
XCODE_RB2 equ $054 * 2文字ルビ(全角用)
XWIDTH equ 96
movem.l d1-d7/a0-a6,sdl_save
move.l 4(sp),a0
* a0 = pointer to string
move.l 8(sp),a1
* a1 = pointer to store
move.l 32(sp),a3
* a3 = blue_mask
move.l #XWIDTH-1,d0
blue_init:
move.b #$ff,0(a3,d0)
dbra d0,blue_init
move.l #XWIDTH,d0
sub.l 28(sp),d0 * x
move.l d0,d6
lsl.l #3,d0 * *8
move.w d0,(a1)+ * x size!!!
move.l 12(sp),a4 * up
move.l 16(sp),a5 * main
move.l 20(sp),a6 * dn
move.l a4,d0
add.l a5,d0
add.l a6,d0
move.w d0,(a1)+ * y size
move.l 24(sp),d5 * jizume
* d5 = jizume
move.l a1,a2
moveq.l #$81,d0 * SUPER
movea.l #0,a1
trap #15
move.l d0,save_ssp
move.l a2,a1
moveq.l #0,d2
cmpa.l d2,a4 * up があるか?
beq skip1
move.l a1,a4
move.l d6,d1 * X 幅
* move.l #8*XWIDTH/4-1,d1
* d1 = d6*2-1
subq.l #1,d1
skip10
move.l d2,(a1)+ * up の分を消去
move.l d2,(a1)+ * up の分を消去
dbra d1,skip10
*
skip1
cmpa.l d2,a5 * main があるか?
beq skip2
move.l a1,a5
move.l d6,d1 * X 幅
* d1 = d6*4-1
subq.l #1,d1
* move.l #16*XWIDTH/4-1,d1
skip20
move.l d2,(a1)+ * main の分を消去
move.l d2,(a1)+ * main の分を消去
move.l d2,(a1)+ * main の分を消去
move.l d2,(a1)+ * main の分を消去
dbra d1,skip20
*
skip2
cmpa.l d2,a6 * dn があるか?
beq skip3
lea 0(a1,d6),a6 * 1 line 開けておく
move.l d6,d1 * X 幅
* d1 = d6-1
subq.l #1,d1
* move.l #4*XWIDTH/4-1,d1
skip30
move.l d2,(a1)+ * dn の分を消去
dbra d1,skip30
*
skip3
move.l _CUT_GETA,d0 * 下駄
moveq.l #0,d7
* d0 returns disp length
move.w _TAB_VIEW,d3 * #0bit = TAB flag
* TAB FLAG
USERL16:
moveq.l #0,d1
move.b (a0)+,d1 * まずは1バイトチェック
bmi USERL40 * $80 以上だから2バイトコードかもしれない
beq USERL30 * eof だから終わり
cmp.b #$20,d1 * コントロールコードか?
blt USERL16_1 * 普通の1バイト半角文字であった($20 - $7f)
USERL16_0:
bsr fg_1byte_1 * その文字のパターンを持ってくる
bra USERL16
*コントロールコードだ!
USERL16_1:
cmp.b #'I'-'@',d1 * TAB
bne USERL17
*0-7 -> 8, 8-15 -> 16...
move.l d0,d4 * TAB 処理用に保存
add.w _TAB_LENGTH,d0
* d0 から d0 mod TAB_LENGTH を引く
move.l d0,d2 * コピー
divu.w _TAB_LENGTH,d2
swap d2
sub.w d2,d0
* d0 OK
move.l d0,d2
sub.l d4,d2
* d2+1 が進んだ桁数
subq.l #1,d2
btst.l #0,d3 * 見えるかどうかのフラグチェック
bne USERL_TAB_VIEW
* 見えないタブ
move.l d4,d0
move.l #' ',d1
U_T_LOOP1:
move.l d3,-(sp)
bsr fg_1byte_1
move.l (sp)+,d3
cmp.w d0,d5
ble TAB_EXIT
dbra d2,U_T_LOOP1
bra TAB_EXIT
USERL_TAB_VIEW:
* 見えるタブ
move.l d4,d0
move.l #$801c,d1 * 半角右矢印
move.l d3,-(sp)
clr.b 0(a3,d7) * blue!
bsr fg_2byte_1
move.l (sp)+,d3
subq.l #1,d2
blt USERL16
move.l #$80a5,d1 * 半角中グロ
U_T_LOOP2:
move.l d3,-(sp)
clr.b 0(a3,d7) * blue!
bsr fg_2byte_1
move.l (sp)+,d3
cmp.w d0,d5
ble TAB_EXIT
dbra d2,U_T_LOOP2
TAB_EXIT:
bclr.l #1,d3
bra USERL16
* TAB 以外のコントロールコード
USERL17
cmp.b #'J'-'@',d1 * CR
bne USERL18
* 改行!
move.w _KAIGYOU_HIGH,d1
clr.b 0(a3,d7) * blue!
clr.b 1(a3,d7) * blue!
bsr fg_2byte_2
bra USERL30 * finish
USERL18
movem.l d1/d3,-(sp) * PUSH
move.b #'^',d1
bsr fg_1byte_1
movem.l (sp)+,d1/d3 * POP
add.b #'@',d1
bsr fg_1byte_1
bra USERL16
USERL40: * 2 byte code check
cmp.b #$ff,d1 * xcode か?
bne USERL405 * not xcode
*XCODE の処理
move.b (a0)+,d1 * get next byte
cmp.b #XCODE_UL,d1 * 2 byte xcode ?
bgt USERL401
blt USERL16 * アンダーラインより小さい(マークである)
* アンダーラインの処理
bset.l #1,d3 * フラグをセットする
bra USERL16
USERL401:
cmp.b #XCODE_RB1R,d1
bgt USERL403 * 2文字ルビ(全角用)
beq USERL402 * 全角用右ルビ
cmpi.b #XCODE_RB1,d1 * $51
* bgt rubi_go_2left * 1文字ルビ左(全角用)
bge rubi_go_1center * 1文字ルビ(半角用)
*1 文字真ん中ルビ
move.l a4,d1 * up があるか?
bne rubi_go_2center
addq.l #2,a0
bra USERL16
rubi_go_2center:
move.b (a0)+,d1
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_rb_2center
bra USERL16
rubi_go_1center: * 1文字ルビ(半角用)
rubi_go_2left: * 1文字ルビ左(全角用)
*ここでOK
move.l a4,d1 * up があるか?
bne rubi_go0
addq.l #2,a0
bra USERL16
rubi_go0:
move.b (a0)+,d1
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_rb_l
bra USERL16
USERL402: * 全角用右ルビ
move.l a4,d1
bne rubi_go1
addq.l #2,a0
bra USERL16
rubi_go1:
move.b (a0)+,d1
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_rb_r
bra USERL16
USERL403: * 2 char RUBI
move.l a4,d1
bne rubi_go2
addq.l #4,a0
bra USERL16
rubi_go2:
move.b (a0)+,d1
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_rb_l
move.b (a0)+,d1
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_rb_r
bra USERL16
USERL405: * not xcode
cmp.b #$a0,d1
blt USERL41 * $a0 未満である
cmp.b #$e0,d1
blt USERL16_0 * 通常の半角カタカナ
cmp.b #$f0,d1 * 1/4 kaku ?
blt USERL42 * 通常全角(2水)
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_1_4
bra USERL16
USERL41:
cmp.b #$80,d1 * hankaku hiragana ?
bne USERL42
* 半角ひらかなである
USERL42_0:
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_1
bra USERL16
USERL42:
* 通常全角である
lsl.w #8,d1
move.b (a0)+,d1
bsr fg_2byte_2
bra USERL16
USERL30:
move.l save_ssp,a1 * old ssp
move.l d0,save_ssp
moveq.l #$81,d0 * SUPER
trap #15
movem.l sdl_save,d1-d7/a0-a6
move.l save_ssp,d0
rts
fg_1byte_1:
fg_2byte_1:
fg_2byte_1_4:
movem.l d0/d1-d2/a5,-(sp)
bclr.l #1,d3 * アンダーラインフラグのチェック(破壊検査)
beq fg_1byte_1_skip
move.l a6,d0 * dn があるか?
beq fg_1byte_1_skip
move.b #$ff,0(a6,d7)
fg_1byte_1_skip:
btst.b #3,_CTCOLOR
bne fg_1byte_1_rev
lea 0(a5,d7),a5
moveq.l #8,d2
moveq.l #$16,d0 * FNTADR
trap #15
move.l d0,a2
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)
adda.w d6,a5
movem.l (sp)+,d0/d1-d2/a5
addq.l #1,d0
addq.l #1,d7
rts
fg_1byte_1_rev
lea 0(a5,d7),a5
moveq.l #8,d2
moveq.l #$16,d0 *FNTADR
trap #15
move.l d0,a2
moveq.l #-1,d2
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
move.b (a2)+,d1
eor.b d2,d1
move.b d1,(a5)
adda.w d6,a5
movem.l (sp)+,d0/d1-d2/a5
addq.l #1,d0
addq.l #1,d7
rts
fg_2byte_2:
movem.l d0/d1-d2/a5,-(sp)
bclr.l #1,d3 * アンダーラインフラグのチェック(破壊検査)
beq fg_2byte_2_skip
move.l a6,d0 * dn があるか?
beq fg_2byte_2_skip
move.b #$ff,0(a6,d7)
move.b #$ff,1(a6,d7)
fg_2byte_2_skip:
btst.b #3,_CTCOLOR
bne fg_2byte_2_rev
lea 0(a5,d7),a5
moveq.l #8,d2
moveq.l #$16,d0 *FNTADR
trap #15
move.l d0,a2
move.l a5,d0
btst.l #0,d0
bne odd_loop1
btst.l #0,d6
bne odd_loop1
* even !
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
move.w (a2)+,(a5)
adda.w d6,a5
movem.l (sp)+,d0/d1-d2/a5
addq.l #2,d0
addq.l #2,d7
rts
odd_loop1:
subq.l #1,d6 * 全角だから
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
move.b (a2)+,(a5)+
move.b (a2)+,(a5)
adda.w d6,a5
addq.l #1,d6 * 戻す
movem.l (sp)+,d0/d1-d2/a5
addq.l #2,d0
addq.l #2,d7
rts
fg_2byte_2_rev
lea 0(a5,d7),a5
moveq.l #8,d2
moveq.l #$16,d0 *FNTADR
trap #15
move.l d0,a2
moveq.l #-1,d2
move.l a5,d0
btst.l #0,d0
bne odd_loop2
btst.l #0,d6
bne odd_loop2
* even !
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.w d1,(a5)
adda.w d6,a5
movem.l (sp)+,d0/d1-d2/a5
addq.l #2,d0
addq.l #2,d7
rts
odd_loop2:
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
move.w (a2)+,d1
eor.w d2,d1
move.b d1,1(a5)
lsr.w #8,d1
move.b d1,(a5)
adda.w d6,a5
movem.l (sp)+,d0/d1-d2/a5
addq.l #2,d0
addq.l #2,d7
rts
fg_2byte_rb_r:
movem.l d0/d1-d2/a4,-(sp)
lea 1(a4,d7),a4
bra fg_2byte_rb_l0
fg_2byte_rb_l:
* btst.b #3,_CTCOLOR
* bne fg_1byte_1_rev
movem.l d0/d1-d2/a4,-(sp)
lea 0(a4,d7),a4
fg_2byte_rb_l0:
moveq.l #8,d2
moveq.l #$16,d0 * FNTADR
trap #15
move.l d0,a2
move.b (a2)+,(a4)
adda.w d6,a4
move.b (a2)+,(a4)
adda.w d6,a4
move.b (a2)+,(a4)
adda.w d6,a4
move.b (a2)+,(a4)
adda.w d6,a4
move.b (a2)+,(a4)
adda.w d6,a4
move.b (a2)+,(a4)
adda.w d6,a4
move.b (a2)+,(a4)
adda.w d6,a4
move.b (a2)+,(a4)
adda.w d6,a4
movem.l (sp)+,d0/d1-d2/a4
rts
fg_2byte_rb_2center:
* btst.b #3,_CTCOLOR
* bne fg_1byte_1_rev
movem.l d0-d2/a4-a5,-(sp)
lea 0(a4,d7),a4
moveq.l #8,d2
moveq.l #$16,d0 * FNTADR
trap #15
move.l d0,a2
move.b (a2)+,d1 * get data
move.b d1,d2
lsr.b #4,d1
lsl.b #4,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
move.b (a2)+,d1 * get data
ror.b #4,d1
move.b d1,d2
andi.b #$0f,d1
andi.b #$f0,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
move.b (a2)+,d1 * get data
ror.b #4,d1
move.b d1,d2
andi.b #$0f,d1
andi.b #$f0,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
move.b (a2)+,d1 * get data
ror.b #4,d1
move.b d1,d2
andi.b #$0f,d1
andi.b #$f0,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
move.b (a2)+,d1 * get data
ror.b #4,d1
move.b d1,d2
andi.b #$0f,d1
andi.b #$f0,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
move.b (a2)+,d1 * get data
ror.b #4,d1
move.b d1,d2
andi.b #$0f,d1
andi.b #$f0,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
move.b (a2)+,d1 * get data
ror.b #4,d1
move.b d1,d2
andi.b #$0f,d1
andi.b #$f0,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
move.b (a2)+,d1 * get data
ror.b #4,d1
move.b d1,d2
andi.b #$0f,d1
andi.b #$f0,d2
move.b d1,(a4)
move.b d2,1(a4)
adda.w d6,a4
movem.l (sp)+,d0-d2/a4-a5
rts
.data
.even
fg_work
ds.b 2+2+16*2
.even
sdl_save
ds.l 14
save_ssp
ds.l 1
.even
#endasm
}
/* パターンを表示する */
/* 新しい x 座標を返す */
/* 実際はバイト単位で処理する */
void
etc_put_pattern(int x,int yd,UBYTE *pat,STR blue_mask)
{
register int c;
c = *((UWORD *) PAT0) = *((UWORD *) PAT) /= 8;
((UWORD *) PAT0)[1] = ((UWORD *) PAT)[1];
if (CTCOLOR & 1) {
etc_textput(x,yd,PAT);
} else {
etc_textput(x,yd,PAT0);
}
if (CTCOLOR & 2) {
etc_mask_blue(PAT,blue_mask);
etc_textput(x,yd+1024,PAT);
} else {
etc_textput(x,yd+1024,PAT0);
}
}
#if 1
/* p = xsize.w, ysize.w, data... */
void
etc_textput(int x,int y,UBYTE *p)
{
#asm
movem.l d1/d2/d3/a1/a2,-(sp)
move.l 32(sp),a2 *p
move.l 28(sp),d0 *y
move.l 24(sp),d1 *x
move.w (a2)+,d3 *xs
moveq.l #0,d2
move.w (a2)+,d2 *ys:個数
*転送先アドレスOK
asl.l #7,d0 *y=y*128
add.l d0,d1 *d1=y*128+x
add.l #$e00000,d1 *d1=0xe00000+y*128+x
lea et_dba_rb,a0 *DMA table
move.l a0,a1
move.l d2,d0
subq.l #1,d0
et_loop:
move.l d1,(a0)+
move.w d3,(a0)+
add.l #128,d1
dbra d0,et_loop
* for(j=y*128+x,i=0;i<ys;i++,j+=128) {
* TB[i].adr = 0xe00000+j;
* TB[i].len = xs;
* }
move.b #$85,d1 *mode 0b1000 0101
moveq.l #$8b,d0 *DMAMOV_A
trap #15 *iocs call
movem.l (sp)+,d1/d2/d3/a1/a2
rts
.data
.even
et_dba_rb:
ds.b 6*142 *最大142ブロック
#endasm
}
#else
struct CHAIN {
INT adr;
UWORD len;
};
/* p = xsize.w, ysize.w, data... */
void
etc_textput(int x,int y,UBYTE *p)
{
register UWORD xs,ys;
register int i,j;
struct CHAIN TB[28]; /* max 28 */
xs = *((UWORD *) p);
ys = ((UWORD *) p)[1];
p += 4;
for(j=y*128+x,i=0;i<ys;i++,j+=128) {
TB[i].adr = 0xe00000+j;
TB[i].len = xs;
}
DMAMOV_A(&TB,p,0b10000101,ys);
}
/* p = xsize.w, ysize.w, data... */
void
etc_textput(int x,int y,UBYTE *p)
{
register UWORD xs,ys;
register int i,j;
xs = *((UWORD *) p);
ys = ((UWORD *) p)[1];
p += 4;
for(j=y*128+x,i=0;i<ys;i++,j+=128) {
DMAMOVE(p,0xe00000+j,0b00000101,xs);
p += xs;
}
}
void
etc_textput(int x,int y,UBYTE *p)
{
#asm
movem.l d0-d4/a0-a3,tp_save
moveq.l #$81,d0 * to super
clr.l a1
trap #15
move.l d0,tp_save_ssp
move.l 8(sp),d1 *y
move.l 12(sp),a1 *pattern data
move.w (a1)+,d2 *x byte
move.w (a1)+,d3 *y line
move.l 4(sp),d0 *x
bne not_from_0
cmpi.w #96,d2
bne not_from_0
*address = $E00000+d0+(d1*128)
add.l #$e00000,d0
asl.l #7,d1
add.l d1,d0
movea.l d0,a2
subq.l #1,d3
loopy_96:
move.l a2,a3
*+++++++
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
move.l (a1)+,(a3)+
*+++++++
adda.w #128,a2 * 1 line down
dbra d3,loopy_96
bra finis
*d0=x, d2=xbyte
*(d0+d2) > 96 -> d2=96-d0
not_from_0:
move.l d0,d4
add.l d2,d4
cmpi.l #96,d4
ble not_from_00
*越えた
*address = $E00000+d0+(d1*128)
moveq.l #95,d4
sub.l d0,d4 *d4 = 96 - d0 - 1
add.l #$e00000,d0
asl.l #7,d1
add.l d1,d0
move.l d0,a2 *first address
subq.l #1,d3 *ybyte dec
loopy:
move.l d4,d0
move.l a2,a3 *copy dest
move.l a1,a0 *copy source
loopx:
move.b (a0)+,(a3)+
dbra d0,loopx
adda.w #128,a2 * 1 line down
adda.w d2,a1 * inc source
dbra d3,loopy
bra finis
not_from_00:
*address = $E00000+d0+(d1*128)
add.l #$e00000,d0
asl.l #7,d1
add.l d1,d0
movea.l d0,a2
subq.l #1,d3
subq.l #1,d2
loopy0:
move.l d2,d4
move.l a2,a3
loopx0:
move.b (a1)+,(a3)+
dbra d4,loopx0
adda.w #128,a2 * 1 line down
dbra d3,loopy0
finis:
moveq.l #$81,d0
movea.l tp_save_ssp,a1
trap #15
movem.l tp_save,d0-d4/a0-a3
rts
.even
.data
tp_save:
ds.l 16
.even
tp_save_ssp:
ds.l 1
#endasm
}
#endif
void
etc_mask_blue(STR pat,STR bm)
{
#asm
* register int i,x,x0;
* register STR p;
movem.l d1/d3/d4/a3/a4/a5,-(sp)
move.l 28(sp),a4 *pat
move.l 32(sp),a3 *bm
beq emb_finis
* if (bm) { /* 指定されたなら */
move.w _LYW_MAIN,d1
subq.l #1,d1 *d1 = _LYW_MAIN-1
moveq.l #0,d3
move.w (a4),d3
move.l d3,d4 *d3=x,d4=x0
* x0 = x = *((UWORD *) pat); /* 横のバイト数 */
move.w _LYW_UPPER,d0
mulu.w d3,d0
lea 4(a4,d0),a4
* p = pat + 4 + (LYW_UPPER*x);
subq.l #1,d3
ble emb_finis
emb_loop1:
tst.b (a3)+
bne emb_skip
* while(--x >= 0) {
* if (!bm[x]) { /* 青くする */
move.l a4,a5 *save
move.l d1,d0 *d1 = _LYW_MAIN-1
emb_loop2:
clr.b (a4)
adda.l d4,a4
dbra d0,emb_loop2
move.l a5,a4 *back
* for(i=0;i<LYW_MAIN;i++) {
* p[x+i*x0] = EOS;
* }
* }
* }
* }
emb_skip:
addq.l #1,a4
dbra d3,emb_loop1
emb_finis:
movem.l (sp)+,d1/d3/d4/a3/a4/a5
rts
#endasm
}
/* ファイル名に使える文字かどうかを調べる */
/* バックスラッシュとドットもOK */
int
etc_is_filename_char(UWORD c)
{
/* v-英数字、アンダーライン */
return((c > 0x80) || iscsym(c) || strchr("()@^{}!.\\",c));
}
STR
etc_first_filename_char(STR s)
{
register UWORD c;
while(c = etc_jfirst(s)) {
if (etc_is_filename_char(c)) {
/*
if (c == ' ') {
error("get space");
}
*/
return(s);
}
if (c >= 0x100) {
s += 2;
} else {
s++;
}
}
return(NULL);
}
/* 長すぎるかどうかを返す */
int
etc_limit_strcat(STR d,STR s,int limit)
{
if ((strlen(d) + strlen(s)) > limit) {
return(1);
}
strcat(d,s);
return(0);
}
/* 見付けたらコードの次のアドレスを返す */
int
etc_get_left(STR s,UBYTE code,STR d)
{
register STR p;
if (p = strchr(s,code)) {
strncpy(d,s,p-s);
d[(p++)-s] = EOS; /* get left */
}
return(p);
}
int
etc_child(STR task)
{
return(child(task));
}
/* デレイなウエイト */
void
etc_while_fep_qxf()
{
register UINT w;
register int t0,t;
t0 = ONTIME();
while((w = fep_qxf()) && (w != 0x210)) { /* マウスの左ボタンでない限り */
if ((t = ONTIME()) < t0) { /* リセットされた */
t += 8640000;
}
if ((t - t0) >= 20) {
break;
}
}
}
#if 1
void
etc_beep()
{
beep();
}
#else
void
etc_beep()
{
int t0,t;
int p0,p3;
p0 = TPALET(0,-1);
p3 = TPALET(3,-1);
TPALET(0,p3);
TPALET(3,p0); /* 反転 */
t0 = ONTIME();
beep();
while(1) {
t = ONTIME();
if ((t < t0) || (t > (t0+5))) {
break;
}
}
TPALET(0,p0);
TPALET(3,p3);
}
#endif
#if 0
void
etc_www()
{
while(!fep_shift_ctrl());
}
void
etc_www0()
{
while(!fep_shift_ctrl());
while(fep_shift_ctrl());
}
#endif
extern COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
extern COMMAND_UNIT command_table0[MAX_COMMAND_NUMBER]; /* ME */
extern COMMAND_UNIT command_table1[MAX_COMMAND_NUMBER]; /* ED */
extern COMMAND_UNIT command_table00[MAX_COMMAND_NUMBER]; /* ME */
extern COMMAND_UNIT command_table10[MAX_COMMAND_NUMBER]; /* ED */
/* キーバインドを CMDMOD にもとづいて書き換える */
/* キーバインドが汚れていれば何もしない */
/* キーバインドを汚す */
/* 該当番号を返す */
/* 該当しなかった場合は -1 を返す */
int
etc_kb_change(UWORD ks[],UWORD kd[])
{
register int i,j;
register UWORD *p;
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
if (CMDMOD) { /* ed である */
p = command_table1[i].COMMAND_STRING;
} else { /* me である */
p = command_table0[i].COMMAND_STRING;
}
/*printf("(%d)(%d)\n",i,etc_uwordcmp(p,ks));binkey();*/
if ((!p[MAX_COMMAND_STROKE]) && etc_uwordcmp(p,ks)) {
/* 汚れてない&一致した */
for(j=0;j<MAX_COMMAND_STROKE;j++) {
p[j] = kd[j]; /* 転送する */
}
etc_kb_soil(i); /* 汚す */
return(i);
}
}
/* 一致するものがなかった */
return(-1);
}
int
etc_uwordcmp(UWORD *s,UWORD *d)
{
while(*s && *d) { /* どちらも0でない限り */
if (*s++ != *d++) {
return(0);
}
}
return(*s == *d); /* 共に0か? */
}
/* キーバインドを汚す */
void
etc_kb_soil(int i)
{
if (CMDMOD) {
command_table1[i].COMMAND_STRING[MAX_COMMAND_STROKE+1-1] = (UWORD)0xffff; /* UWORD! */
} else {
command_table0[i].COMMAND_STRING[MAX_COMMAND_STROKE+1-1] = (UWORD)0xffff; /* UWORD! */
}
}
/* キーバインドをすべて洗う */
void
etc_kb_wash()
{
register int i;
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
command_table0[i].COMMAND_STRING[MAX_COMMAND_STROKE+1-1] = 0x0000; /* UWORD! */
command_table1[i].COMMAND_STRING[MAX_COMMAND_STROKE+1-1] = 0x0000; /* UWORD! */
}
}
void
etc_wait_y()
{
UBYTE c;
fep_key_clear();
while(1) {
etc_beep();
c = toupper(fep_inkey_raw());
if (c == 'Y') {
break;
}
}
}
UBYTE
etc_command_pick(UBYTE c,void (*f)())
{
register int i,c0;
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
if (command_table[i].FUNCTION == f) { /* 関数が一致 */
if (!command_table[i].COMMAND_STRING[1]) { /* 1ストロークだ */
c0 = command_table[i].COMMAND_STRING[0];
if (c0 < 0x20) {
c = c0;
} else { /* コントロールキーではない! */
c |= 0x80; /* MSB を立てる */
}
} else { /* 1ストロークではない! */
c |= 0x80; /* MSB を立てる */
}
break;
}
}
return(c);
}
void
etc_command_patch_miss(STR mes,UBYTE code)
{
UBYTE w[MAXLINE];
sprintf(w,"%sのコードを ^%c にします。",mes,code+'@');
error(w);
}
int
etc_remove_cr_tab(STR s)
{
register int i,j;
for(i=j=0;s[i];) {
if ((s[i] == TAB) || (s[i] == CR)) {
i++;
} else {
s[j++] = s[i++];
}
}
s[j] = EOS;
return(j);
}
int
etc_jiskata(UINT c)
{
if (jiskata(c)) {
return(1);
} else if ((0xa0 <= c) && (c <= 0xdf)) { /* 1バイト半角カタカナだ */
return(1);
} else if ((0xf0a0 <= c) && (c <= 0xf0df)) { /* 1/4角上付カタカナ */
return(1);
} else if ((0xf2a0 <= c) && (c <= 0xf2df)) { /* 1/4角下付カタカナ */
return(1);
}
return(0);
}
int
etc_jishira(UINT c)
{
if (jishira(c)) {
return(1);
}
/* 2バイト半角文字かも知れない */
if ((0x8086 <= c) && (c <= 0x80fd)) {
return(1);
}
if (((0xf086 <= c) && (c <= 0xf3fd)) && ((c & 0xff) >= 0x86) && !etc_jiskata(c)) {
return(1); /* 上付か下付のひらがな */
}
return(0);
}
/* 全角のカタカナを、全角のひらがなにする */
/* 半角のカタカナも2バイト半角文字のひらがなにする */
/* 1/4角も面倒みる */
void
etc_zen_kata_to_hira(STR d0,STR s,int size)
{
UINT c;
UBYTE dd[VERY_LONG_LINE];
register UBYTE *d;
d = dd;
while(s = etc_jfirst_x(s,&c)) {
c = etc_zen_kata_to_hira1(c);
if (c > 0xff) { /* 2バイト文字だ */
*d++ = (c >> 8);
*d++ = c &0xff;
} else {
*d++ = c;
}
}
*d = EOS;
if (strlen(d) > MAX_TB) {
etc_beep();
under_print("変換する文字列が長すぎます");
} else {
strcpy(d0,dd);
}
}
/* 全角のひらがなを、全角のカタカナにする */
/* 2バイト半角文字のひらがなもカタカナにする */
/* 1/4角も面倒みる */
void
etc_zen_hira_to_kata(STR d,STR s,int size)
{
UINT c;
while(s = etc_jfirst_x(s,&c)) {
c = etc_zen_hira_to_kata1(c);
if (c > 0xff) { /* 2バイト文字だ */
*d++ = (c >> 8);
*d++ = c &0xff;
} else {
*d++ = c;
}
}
*d = EOS;
}
UINT
etc_zen_kata_to_hira1(UINT c)
{
if (jiskata(c)) {
if (c <= (UINT) L'ミ') {
c -= ((UINT)L'ァ' - (UINT)L'ぁ');
} else if ((c >= L'ヴ') && (c <= L'ヶ')) {
/* 何もしない */
} else {
c -= ((UINT)L'ム' - (UINT)L'む');
}
} else if ((0xa0 <= c) && (c <= 0xdf)) { /* 1バイト半角カタカナだ */
if (c != 0xb0) {
c = 0x8000 | c;
}
} else if ((c & 0xff00) == 0xf000) { /* 上付1/4角 */
c = 0xf100 | (c & 0xff);
} else if ((c & 0xff00) == 0xf200) { /* 下付1/4角 */
c = 0xf300 | (c & 0xff);
}
return(c);
}
UINT
etc_zen_hira_to_kata1(UINT c)
{
if (jishira(c)) { /* ひらがなである */
if (c <= (UINT) L'み') {
c += ((UINT)L'ァ' - (UINT)L'ぁ');
} else {
c += ((UINT)L'ム' - (UINT)L'む');
}
} else if ((0x813f <= c) && (c <0xf000 )) { /* 普通の2バイト文字 */
/* 何もしない */
} else if (c > 0xff ) {
c = etc_normalize_hira(c);
if (c <= 0x80ff) {
c &= 0xff;
} else {
c -= 0x100;
}
}
return(c);
}
/* 正規化する */
UINT
etc_normalize_hira(UINT c)
{
register int cl;
cl = c & 0xff;
switch(c & 0xff00) {
case 0x8000:
case 0xf100:
case 0xf300:
if ((0x86 <= cl) && (cl < 0xa0)) {
c += 0x20;
} else if ((0xe0 < cl) && (cl < 0xfe)) {
c -= 0x20;
}
return(c);
case 0xf000:
case 0xf200:
if ((0x86 <= cl) && (cl < 0xa0)) {
c += 0x120;
} else if ((0xe0 < cl) && (cl < 0xfe)) {
c += 0x100 -0x20;
}
return(c);
default:
return(c);
}
}
WORD DIC_MODE;
void
etc_exit(int ecode)
{
KNJCTRL(11,DIC_MODE);
KNJCTRL(1,0);
exit(ecode);
}
extern UINT LED_MODE_OUT;
extern UINT LED_MODE;
/* 色々する */
/* click_on | 禁則 | プリンタ情報付加 */
void
etc_begin()
{
char *swp,w;
LED_MODE_OUT = K_SFTSNS();
KNJCTRL(1,1);/* ,,, */
LED_MODE = K_SFTSNS();
KNJCTRL(1,0);
#if 0
KNJCTRL(7,0);
#endif
KNJCTRL(28);
DIC_MODE = KNJCTRL(12);
if (swp = (STR)getenv("TWSWITCH")) {
} else {
swp = (STR)getenv("twswitch");
}
if (swp) {
sysflag = strtol(swp,w,0);/* 各指定が有効 */
} else {
sysflag = 0;
}
if (sysflag & 0b10) {
cut_switch_change();
}
if (sysflag & 0b100) {
CLICK_MODE = 1;
} else {
CLICK_MODE = 0;
}
#if 0
if (sysflag & 0b1000) { /* 改行モード */
}
#endif
/*window0();printf("[%d]",sysflag);binkey();*/
}
#if 1
/* 色々する */
/* click_on | 禁則 | プリンタ情報付加 */
void
etc_begin2()
{
#if 1
if (!DUM_FLAG) {
KNJCTRL(7,0);
}
#endif
KNJCTRL(28);
}
#endif
UINT
etc_is_normal_han(UINT code)
{
return((code < 0x7f) || ((0xa0 <= code) && (code <= 0xdf)));
}
/* kc の中に半角か1/4角の2バイト文字が含まれているかどうか返す */
int
etc_is_there_han2byte(STR kc)
{
STR p;
UINT c;
/* 2文字目へのポインタを返す */
/* 最初の文字を返す */
/* 全角文字にも対応 */
/* EOS なら NULL を返す */
p = kc;
while(1) {
p = etc_jfirst_x(p,&c);
if (c) {
if (buff_ishan2byte(c >> 8)) {
return(1);
}
} else {
break;
}
}
return(0);
}